package com.ma.chapter4.t1;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

/**
 * @author mayongqiang
 */
@Slf4j(topic = "m.test")
public class Test1 {


    static int r = 10;



    @Test
    public void Test1() {
        /*
          start()与run()
          直接调用run() 是在主线程中启动，start()是新启动一个线程
         */
        Thread t1 = new Thread("t1") {
            @Override
            public void run() {
                log.debug(Thread.currentThread().getName());
            }
        };
        //t1.run();
        t1.start();
        log.debug(Thread.currentThread().getName());
    }

    @Test
    public void Test2() throws Exception {
        /*
          sleep()
             1. 调用 sleep 会让当前线程从 Running  进入 Timed Waiting 状态（阻塞）
             2. 其它线程可以使用  interrupt 方法打断正在睡眠的线程，这时 sleep 方法会抛出 InterruptedException
             3. 睡眠结束后的线程未必会立刻得到执行
             4. 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性
         yield()
             1. 调用 yield 会让当前线程从 Running 进入 Runnable  就绪状态，然后调度执行其它线程
             2. 具体的实现依赖于操作系统的任务调度器
         */
        Runnable task1 = () -> {
            int count = 0;
            for (; ; ) {
                System.out.println("=========>1" + count++);
            }
        };
        Runnable task2 = () -> {
            int count = 0;
            for (; ; ) {
                Thread.yield();
                System.out.println("            =========>2" + count++);
            }
        };

        Thread t1 = new Thread(task1, "t1");
        Thread t2 = new Thread(task2, "t2");
        t1.start();
        t2.start();
    }

    @Test
    public void Test3() {
        log.debug("开始");
        Thread t1 = new Thread(() -> {
            log.debug("开始");
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("结束");
            r = 10;

        }, "t1");
        t1.start();
        log.debug("结果为：{}", r);
        log.debug("结束");
    }

    @Test
    public  void test5() {
        Thread t1 = new Thread("t1") {
            @Override
            public void run() {
                log.debug("enter sleep");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        t1.start();

    }


}
